//最长上升子序列
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() 
{
    int n;
    while(cin>>n)
    {
        vector<int>nums(n,0);
        vector<int>dp(n,1);
        int res=1;
        //dp[i] 以i下标结尾的最长递增子序列
        for(auto& e:nums) cin>>e;
        for(int i=1;i<n;i++)
        {
            for(int j=0;j<i;j++)
            {
                if(nums[i]>nums[j])
                {
                    dp[i]=max(dp[i],dp[j]+1);
                    res=max(res,dp[i]);
                }
            }
        }
        cout<<res<<endl;
    }
    return 0;
}
//串联所有单词的子串
class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) 
    {
        //将words中的string都看成一个整体进行操作 而不一个字节一个字节的进行比较
        //等同于在一个集合中找 words的字母异位词
        int len=words[0].size();
        vector<int>res;
        unordered_map<string,int>lib;
        for(auto str:words) lib[str]++;
        for(int index=0;index<len;index++)
        {
            unordered_map<string,int>hash;
            int count=0;
            for(int l=index,r=index;r<=s.size();r+=len)
            {
                string in=s.substr(r,len);
                if(++hash[in] <= lib[in]) count++;
                // hash[in]++;
                // if(hash[in]<=lib[in]) count++;
                while((r-l+1)>words.size()*len)
                {
                    string out=s.substr(l,len);
                    if(--hash[out]<lib[out]) count--;
                    l+=len;
                    // hash[out]--;
                    // if(hash[out]<lib[out]) count--;
                }
                if(count==words.size()) res.push_back(l);
            }
        }
        return res;

    }
};